<!DOCTYPE html>
<html>
<head>
<title>VUEX</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) */
/* Author: Nicolas Hery - http://nicolashery.com */
/* Version: b13fe65ca28d2e568c6ed5d7f06581183df8f2ff */
/* Source: https://github.com/nicolahery/markdownpad-github */

/* RESET
=============================================================================*/

html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
  margin: 0;
  padding: 0;
  border: 0;
}

/* BODY
=============================================================================*/

body {
  font-family: Helvetica, arial, freesans, clean, sans-serif;
  font-size: 14px;
  line-height: 1.6;
  color: #333;
  background-color: #fff;
  padding: 20px;
  max-width: 960px;
  margin: 0 auto;
}

body>*:first-child {
  margin-top: 0 !important;
}

body>*:last-child {
  margin-bottom: 0 !important;
}

/* BLOCKS
=============================================================================*/

p, blockquote, ul, ol, dl, table, pre {
  margin: 15px 0;
}

/* HEADERS
=============================================================================*/

h1, h2, h3, h4, h5, h6 {
  margin: 20px 0 10px;
  padding: 0;
  font-weight: bold;
  -webkit-font-smoothing: antialiased;
}

h1 tt, h1 code, h2 tt, h2 code, h3 tt, h3 code, h4 tt, h4 code, h5 tt, h5 code, h6 tt, h6 code {
  font-size: inherit;
}

h1 {
  font-size: 28px;
  color: #000;
}

h2 {
  font-size: 24px;
  border-bottom: 1px solid #ccc;
  color: #000;
}

h3 {
  font-size: 18px;
}

h4 {
  font-size: 16px;
}

h5 {
  font-size: 14px;
}

h6 {
  color: #777;
  font-size: 14px;
}

body>h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h4:first-child, body>h5:first-child, body>h6:first-child {
  margin-top: 0;
  padding-top: 0;
}

a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
  margin-top: 0;
  padding-top: 0;
}

h1+p, h2+p, h3+p, h4+p, h5+p, h6+p {
  margin-top: 10px;
}

/* LINKS
=============================================================================*/

a {
  color: #4183C4;
  text-decoration: none;
}

a:hover {
  text-decoration: underline;
}

/* LISTS
=============================================================================*/

ul, ol {
  padding-left: 30px;
}

ul li > :first-child, 
ol li > :first-child, 
ul li ul:first-of-type, 
ol li ol:first-of-type, 
ul li ol:first-of-type, 
ol li ul:first-of-type {
  margin-top: 0px;
}

ul ul, ul ol, ol ol, ol ul {
  margin-bottom: 0;
}

dl {
  padding: 0;
}

dl dt {
  font-size: 14px;
  font-weight: bold;
  font-style: italic;
  padding: 0;
  margin: 15px 0 5px;
}

dl dt:first-child {
  padding: 0;
}

dl dt>:first-child {
  margin-top: 0px;
}

dl dt>:last-child {
  margin-bottom: 0px;
}

dl dd {
  margin: 0 0 15px;
  padding: 0 15px;
}

dl dd>:first-child {
  margin-top: 0px;
}

dl dd>:last-child {
  margin-bottom: 0px;
}

/* CODE
=============================================================================*/

pre, code, tt {
  font-size: 12px;
  font-family: Consolas, "Liberation Mono", Courier, monospace;
}

code, tt {
  margin: 0 0px;
  padding: 0px 0px;
  white-space: nowrap;
  border: 1px solid #eaeaea;
  background-color: #f8f8f8;
  border-radius: 3px;
}

pre>code {
  margin: 0;
  padding: 0;
  white-space: pre;
  border: none;
  background: transparent;
}

pre {
  background-color: #f8f8f8;
  border: 1px solid #ccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px;
}

pre code, pre tt {
  background-color: transparent;
  border: none;
}

kbd {
    -moz-border-bottom-colors: none;
    -moz-border-left-colors: none;
    -moz-border-right-colors: none;
    -moz-border-top-colors: none;
    background-color: #DDDDDD;
    background-image: linear-gradient(#F1F1F1, #DDDDDD);
    background-repeat: repeat-x;
    border-color: #DDDDDD #CCCCCC #CCCCCC #DDDDDD;
    border-image: none;
    border-radius: 2px 2px 2px 2px;
    border-style: solid;
    border-width: 1px;
    font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
    line-height: 10px;
    padding: 1px 4px;
}

/* QUOTES
=============================================================================*/

blockquote {
  border-left: 4px solid #DDD;
  padding: 0 15px;
  color: #777;
}

blockquote>:first-child {
  margin-top: 0px;
}

blockquote>:last-child {
  margin-bottom: 0px;
}

/* HORIZONTAL RULES
=============================================================================*/

hr {
  clear: both;
  margin: 15px 0;
  height: 0px;
  overflow: hidden;
  border: none;
  background: transparent;
  border-bottom: 4px solid #ddd;
  padding: 0;
}

/* TABLES
=============================================================================*/

table th {
  font-weight: bold;
}

table th, table td {
  border: 1px solid #ccc;
  padding: 6px 13px;
}

table tr {
  border-top: 1px solid #ccc;
  background-color: #fff;
}

table tr:nth-child(2n) {
  background-color: #f8f8f8;
}

/* IMAGES
=============================================================================*/

img {
  max-width: 100%
}
</style>
</head>
<body>
<h1>VUEX</h1>
<h2>1 VUEX基本介绍</h2>
<h3>1.1 官方API</h3>
<pre><code>https://vuex.vuejs.org/zh-cn/
</code></pre>

<h3>1.2 什么是vuex</h3>
<pre><code>vuex是一个专为Vue.js应用程序开发的状态管理模式。
</code></pre>

<h3>1.3 Vuex使用场景</h3>
<ul>
<li>1、Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态，并以相应的规则保证状态以一种可预测的方式发生变化; --&gt; 集中式存储管理应用的所有组件的状态</li>
<li>2、如果是不同的组件，由于由于Vue.js本身组件之间有作用域，它们无法直接相互通信，所以就需要一些东西例如Vuex去集中管理和追踪它的变化；（如下案例一、案例二）</li>
</ul>
<blockquote>
<p>案例一：组件B 与 组件C 可以用$emit和$on实现跨组件通讯  --&gt;  缺点：性能差</p>
</blockquote>
<p><img src="https://gitee.com/hjy1993/markdown-collect/raw/master/resource/img/vuex/component.png" /></p>
<pre><code>// 实现方法
</code></pre>

<p><img src="https://gitee.com/hjy1993/markdown-collect/raw/master/resource/img/vuex/parent.png" /></p>
<blockquote>
<p>案例二：假设当 组件D 与 组件F 实现跨组件通讯  --&gt;  缺点：代码可读性差</p>
</blockquote>
<p><img src="https://gitee.com/hjy1993/markdown-collect/raw/master/resource/img/vuex/component2.png" /></p>
<ul>
<li>
<p>3、各组件间的状态同步（以及同一组件再次显示时的状态保持） --&gt; 共享参数，一个地方更改参数，全局都会更改；</p>
<p>总结：1、集中式存储管理应用的所有组件的状态（集中管理数据）
     2、解决不同组件之间通信的问题、各组件状态同步</p>
</li>
</ul>
<h3>1.4 Vuex的缺点</h3>
<ul>
<li>
1、如果您不打算开发大型单页应用，使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单，您最好不要使用 Vuex；
    （他的意思其实就是如果开发的程序并不是很庞大，一个页面中的组件不是很多并且他们之间并不需要大量频繁的互相读写操作，那么就可以直接使用传统的Vue.js中的组件Prop或者事件触发来修改状态，或者用非父子组件通信 中介绍的new一个空的Vue对象实例，并且通过事件触发等方式来跨组件通信）
</li>
<li>2、vuex需要有一段时间的学习成本；</li>
</ul>
<h3>1.5 Vuex 和 本地存储 的区别</h3>
<ul>
<li>最重要的区别：vuex存储在内存，localstorage则以文件的方式存储在本地</li>
<li>应用场景：vuex用于组件之间的传值，localstorage则主要用于不同页面之间的传值</li>
<li>永久性：当刷新页面时vuex存储的值会丢失，localstorage不会</li>
<li>当两个组件共用一个数据源（对象或数组）时，如果其中一个组件改变了该数据源，希望另一个组件响应该变化时，localstorage无法做到，原因就是区别1</li>
</ul>
<h3>1.6 安装 和 使用</h3>
<pre><code>安装：
npm install vuex --save

使用：（在main.js）
import Vuex from 'vuex'
Vue.use(Vuex)
</code></pre>

<h3>1.7 Vuex五个核心概念</h3>
<blockquote>
<p>1、State（变量定义）</p>
</blockquote>
<pre><code>1） State是唯一的数据源  --&gt;  用一个对象就包含了全部的应用层级状态
2） 单一的状态树  --&gt;  直接地定位任一特定的状态片段，在调试的过程中也能轻易地取得整个当前应用状态的快照
const Counter = {
  template: '&lt;div&gt;{{ count }}&lt;/div&gt;',
  computed: {
    count () {
      // this.$store：vuex对象
      return this.$store.state.count
    }
  }
}
</code></pre>

<blockquote>
<p>2、Getters（相当于计算属性  --&gt;  对列表进行过滤并计数）</p>
</blockquote>
<pre><code>1）通过Getters可以派生出一些新的状态
const store = new Vuex.Store({
  state: {
    todos: {
      { id:1, text: '...', done: true},
      { id:2, text: '...', done: false}
    }
  },
  getters: {
    doneTodos: state =&gt; {
      // 返回是true 
      return state.todos.filter(todo =&gt; todo.done)
    }
  }
}) 
</code></pre>

<blockquote>
<p>3、Mutaions（同步操作：调用接口）</p>
</blockquote>
<pre><code>1）更改Vuex的store中的状态的唯一方法是提交mutation
const store = new Vuex.Store({
  state: {
    count:1
  },
  mutations: {
    increment(state){
      // 变更状态
      state.count++
    }
  }
})

// 运行以上方法
store.commit('increment');
</code></pre>

<blockquote>
<p>4、Actions（异步操作）</p>
</blockquote>
<pre><code>1）Action提交的是mutation，而不是直接变更状态
2）可以包含任意异步操作
const store = new Vuex.Store({
  state: {
    count:0
  },
  mutations: {
    increment(state){
      // 变更状态
      state.count++
    }
  },
  actions: {
    increment(context){
      context.commit('increment');
    }
  }
})
</code></pre>

<blockquote>
<p>5、Modules（模块）</p>
</blockquote>
<pre><code>1）面对复杂的应用程序，当管理的状态比较多时，我们需要将Vuex的store对象分割成模块（modules）
const muduleA = {
  state:{},
  mutaions:{},
  actions:{},
  getters:{}
}

const muduleB = {
  state:{},
  mutaions:{},
  actions:{}
}

const store = new Vuex.Store({
  modules:{
    a: muduleA,
    b :muduleB
  }
})

store.state.a // -&gt; moduleA 的状态
store.state.b // -&gt; moduleB 的状态
</code></pre>

<ul>
<li>actions 和 mutations的区别:</li>
</ul>
<p><img src="https://gitee.com/hjy1993/markdown-collect/raw/master/resource/img/vuex/zhihu.png" /></p>
<h2>2 案例一：购物车数量、登录用户信息</h2>
<h3>2.1 案例演示</h3>
<p><img src="https://gitee.com/hjy1993/markdown-collect/raw/master/resource/img/vuex/shopping.gif" /></p>
<h3>2.2 使用场景分析</h3>
<ul>
<li>多个页面会修改购物车数量，而购物车的变量应是抽离出来的state（相当于全局变量），方便其他页面修改调用</li>
<li>存储用户信息，判断用户是否登录</li>
</ul>
<h3>2.3 核心代码分析</h3>
<blockquote>
<p>1 main.js引用vuex</p>
<p>2 定义state和mutations</p>
</blockquote>
<p><img src="https://gitee.com/hjy1993/markdown-collect/raw/master/resource/img/vuex/shopping-state.png" /></p>
<blockquote>
<p>3 登录时调用mutations给state赋值</p>
</blockquote>
<p><img src="https://gitee.com/hjy1993/markdown-collect/raw/master/resource/img/vuex/shopping-mutations.png" /></p>
<blockquote>
<p>4 退出</p>
</blockquote>
<p><img src="https://gitee.com/hjy1993/markdown-collect/raw/master/resource/img/vuex/shopping-mutations-null.png" /></p>
<blockquote>
<p>5 修改购物车数量</p>
</blockquote>
<p><img src="https://gitee.com/hjy1993/markdown-collect/raw/master/resource/img/vuex/shopping-mutations-add.png" /></p>
<blockquote>
<p>6 获取state参数(两种写法)</p>
</blockquote>
<p><img src="https://gitee.com/hjy1993/markdown-collect/raw/master/resource/img/vuex/shopping-state2.png" /></p>
<h2>3 案例二：列表数据</h2>
<h3>3.1 案例演示</h3>
<p><img src="https://gitee.com/hjy1993/markdown-collect/raw/master/resource/img/vuex/todo.gif" /></p>
<h3>3.2 使用场景分析</h3>
<ul>
<li>实时获取列表数据的最新数据（状态），只需页面一初始化调用一次列表数据，对列表的状态信息修改，无需再请求列表数据；除非重新刷新页面</li>
<li>接口请求成为全局，方便调用；</li>
</ul>
<h3>3.3 核心代码分析</h3>
<blockquote>
<p>1 目录结构</p>
</blockquote>
<p><img src="https://gitee.com/hjy1993/markdown-collect/raw/master/resource/img/vuex/store.png" /></p>
<blockquote>
<p>2 引用相应文件</p>
</blockquote>
<p><img src="https://gitee.com/hjy1993/markdown-collect/raw/master/resource/img/vuex/store2.png" /></p>
<blockquote>
<p>3 在actions.js写入异步请求方法接口（部分代码）</p>
</blockquote>
<p><img src="https://gitee.com/hjy1993/markdown-collect/raw/master/resource/img/vuex/action.png" /></p>
<blockquote>
<p>4 介绍 { commit } 与 store 两种用法</p>
<p>5 在mutation.js修改state的值（部分代码）</p>
</blockquote>
<p><img src="https://gitee.com/hjy1993/markdown-collect/raw/master/resource/img/vuex/state.png" /></p>
<blockquote>
<p>6 在state.js定义状态</p>
</blockquote>
<p><img src="https://gitee.com/hjy1993/markdown-collect/raw/master/resource/img/vuex/state2.png" /></p>
<blockquote>
<p>7 使用
- 引入mapState mapActions
- 调用</p>
</blockquote>
<pre><code>...mapState(['todos'])

...mapActions([
    'fetchTodos',
    'addTodo',
    'deleteTodo',
    'updateTodo',
    'deleteAllCompleted'
  ])
</code></pre>

<h1>THE END</h1>

</body>
</html>
<!-- This document was created with MarkdownPad, the Markdown editor for Windows (http://markdownpad.com) -->
